
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2002, John K. Grant and Perry L. Miller IV.
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Pair of matrix functors.
//
///////////////////////////////////////////////////////////////////////////////

#include "Interaction/Matrix/MatrixPair.h"

using namespace Usul::Functors::Interaction::Matrix;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

MatrixPair::MatrixPair ( 
  Unknown *caller, 
  MatrixFunctor *c1, 
  MatrixFunctor *c2,
  const std::string &name ) : 
  BaseClass ( caller, name ),
  _c1 ( c1 ),
  _c2 ( c2 )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Copy constructor.
//
///////////////////////////////////////////////////////////////////////////////

MatrixPair::MatrixPair ( const MatrixPair &cb ) : BaseClass ( cb ),
  _c1 ( cb._c1 ),
  _c2 ( cb._c2 )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

MatrixPair::~MatrixPair()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the matrix.
//
///////////////////////////////////////////////////////////////////////////////

void MatrixPair::operator()()
{
  Guard guard ( this->mutex() );

  if ( ( true == _c1.valid() ) && ( true == _c2.valid() ) )
  {
    (*_c1)();
    (*_c2)();

    _matrix = _c1->matrix() * _c2->matrix();
  }
}


///////////////////////////////////////////////////////////////////////////////
//
//  Clone.
//
///////////////////////////////////////////////////////////////////////////////

Usul::Functors::Interaction::Common::BaseFunctor* MatrixPair::clone()
{
  return new MatrixPair ( *this );
}
